// 文件路径: com.city.java.files.controller.FileUploadController.java
package com.city.java.files.controller;

import com.city.java.base.response.JsonResult;
import com.city.java.base.response.StatusCode;
import com.city.java.files.service.FileUploadService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.Arrays;
import java.util.List;

/**
 * 文件上传控制器（仅支持图片上传）
 */
@Slf4j
@Api(tags = "13.文件上传模块")
@RestController
@RequestMapping("/api/files")
public class FileUploadController {

    @Autowired
    private FileUploadService fileUploadService;

    // 支持的图片格式
    private static final List<String> ALLOWED_IMAGE_TYPES = Arrays.asList(
        "image/jpeg",
        "image/png",
        "image/gif",
        "image/bmp",
        "image/webp"
    );

    /**
     * 上传图片文件
     * @param file 上传的图片文件
     * @return 上传结果
     */
    @PostMapping("/upload")
    @ApiOperation(value = "上传图片", notes = "上传单个图片文件")
    public JsonResult uploadImage(
            @ApiParam(value = "图片文件", required = true)
            @RequestParam("file") MultipartFile file) {
        log.info("接收到图片上传请求: 文件名={}", file.getOriginalFilename());

        // 检查文件是否为空
        if (file.isEmpty()) {
            log.warn("上传文件为空");
            return new JsonResult(StatusCode.INVALID_PARAMETER, "上传文件不能为空");
        }

        // 检查文件类型
        String contentType = file.getContentType();
        if (contentType == null || !ALLOWED_IMAGE_TYPES.contains(contentType)) {
            log.warn("不支持的文件类型: {}", contentType);
            return new JsonResult(StatusCode.INVALID_PARAMETER, "只支持上传图片文件（JPG、PNG、GIF、BMP、WEBP）");
        }

        // 检查文件大小（限制为2MB）
        if (file.getSize() > 2 * 1024 * 1024) {
            log.warn("文件大小超过限制: {} bytes", file.getSize());
            return new JsonResult(StatusCode.INVALID_PARAMETER, "图片文件大小不能超过2MB");
        }

        try {
            String imageUrl = fileUploadService.uploadImage(file);
            if (imageUrl != null) {
                log.info("图片上传成功: {}", imageUrl);
                return JsonResult.ok(new ImageUploadResult(imageUrl));
            } else {
                log.warn("图片上传失败: 文件名={}", file.getOriginalFilename());
                return new JsonResult(StatusCode.OPERATION_FAILED, "图片上传失败");
            }
        } catch (IOException e) {
            log.error("图片上传异常: 文件名={}", file.getOriginalFilename(), e);
            return new JsonResult(StatusCode.OPERATION_FAILED, "图片上传异常: " + e.getMessage());
        } catch (IllegalArgumentException e) {
            log.warn("图片上传参数错误: {}", e.getMessage());
            return new JsonResult(StatusCode.INVALID_PARAMETER, e.getMessage());
        } catch (Exception e) {
            log.error("图片上传失败: 文件名={}", file.getOriginalFilename(), e);
            return new JsonResult(StatusCode.OPERATION_FAILED, "图片上传失败: " + e.getMessage());
        }
    }

    /**
     * 批量上传图片文件
     * @param files 上传的图片文件列表
     * @return 上传结果
     */
    @PostMapping("/upload/batch")
    @ApiOperation(value = "批量上传图片", notes = "上传多个图片文件")
    public JsonResult uploadImages(
            @ApiParam(value = "图片文件列表", required = true)
            @RequestParam("files") MultipartFile[] files) {
        log.info("接收到批量图片上传请求: 文件数量={}", files.length);

        if (files.length == 0) {
            log.warn("上传文件列表为空");
            return new JsonResult(StatusCode.INVALID_PARAMETER, "上传文件列表不能为空");
        }

        try {
            ImageUploadResult[] results = fileUploadService.uploadImages(files);
            log.info("批量图片上传成功: 上传数量={}", results.length);
            return JsonResult.ok(results);
        } catch (Exception e) {
            log.error("批量图片上传异常", e);
            return new JsonResult(StatusCode.OPERATION_FAILED, "批量图片上传异常: " + e.getMessage());
        }
    }

    /**
     * 图片上传结果类
     */
    @Data
    public static class ImageUploadResult {
        private String url;

        public ImageUploadResult() {}

        public ImageUploadResult(String url) {
            this.url = url;
        }
    }
}
